package controller;  // 声明包名为controller

import pojo.Emp;  // 导入Emp类，用于表示员工实体
import service.IEmpService;  // 导入IEmpService接口，定义服务层方法
import service.impl.EmplService;  // 导入EmplService实现类，提供具体服务实现

import javax.servlet.ServletException;  // 导入Servlet异常类
import javax.servlet.http.HttpServlet;  // 导入HttpServlet类，作为所有Servlet的基类
import javax.servlet.http.HttpServletRequest;  // 导入HttpServletRequest类，处理HTTP请求
import javax.servlet.http.HttpServletResponse;  // 导入HttpServletResponse类，处理HTTP响应
import javax.servlet.http.HttpSession;
import java.io.IOException;  // 导入IOException类，处理输入输出异常
import java.lang.reflect.InvocationTargetException;  // 导入反射相关异常类
import java.lang.reflect.Method;  // 导入Method类，用于反射调用方法
import java.util.ArrayList;  // 导入ArrayList类，用于存储员工列表

// 定义EmpController类，继承HttpServlet，处理员工相关请求
public class EmpController extends HttpServlet {
    private IEmpService ies = new EmplService();  // 创建IEmpService接口实例，使用EmplService实现

    @Override  // 重写doGet方法，处理GET请求
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 当前为空，未实现GET请求处理
    }

    @Override  // 重写doPost方法，处理POST请求
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);  // 调用父类方法，但通常需要重写而不是直接调用父类
    }

    @Override  // 重写service方法，作为请求分发器，根据请求路径调用相应方法
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // super.service(req, resp); // 注释掉父类方法，因为需要自定义分发逻辑

        String requestURI = request.getRequestURI();  // 获取请求的URI路径
        int index = requestURI.lastIndexOf("/") + 1;  // 找到最后一个斜杠的位置，并加1以获取方法名起始索引
        String mName = requestURI.substring(index);  // 截取URI最后部分作为方法名
        Class<EmpController> cla = EmpController.class;  // 获取当前类的Class对象
        Method method = null;  // 声明Method变量，用于存储反射获取的方法
        try {
            // 通过方法名和参数类型获取Method对象（参数为HttpServletRequest和HttpServletResponse）
            response.setContentType("text/html;charset=utf-8");// 设置响应内容类型和字符编码为UTF-8
            request.setCharacterEncoding("utf-8");
            method = cla.getMethod(mName, HttpServletRequest.class, HttpServletResponse.class);
            method.invoke(this, request, response);  // 反射调用该方法，传入当前实例和请求/响应对象
        } catch (NoSuchMethodException e) {  // 捕获找不到方法的异常
            e.printStackTrace();  // 打印异常堆栈
        } catch (IllegalAccessException e) {  // 捕获非法访问异常（如方法不可访问）
            e.printStackTrace();  // 打印异常堆栈
        } catch (InvocationTargetException e) {  // 捕获反射调用目标异常（被调用方法内部异常）
            e.printStackTrace();  // 打印异常堆栈
        }
    }

    // 处理员工登录请求的方法
    public void emplogin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // super.doGet(request, response);  报错405原因:告诉开发者,必须对当前方法做重写（已注释掉）


        String empno = request.getParameter("empno");  // 从请求参数中获取员工编号
        String ename = request.getParameter("ename");  // 从请求参数中获取员工姓名

        // 调用服务层登录方法，传入Emp对象（将empno转换为整数）
        Emp login = ies.Login(new Emp(Integer.parseInt(empno), ename));
        HttpSession session=request.getSession();//获得作用域对象
        if (login != null) {  // 如果登录成功（返回的Emp对象不为空）
/*
            response.getWriter().println("<script type='text/javascript'>alert('登录成功 ok!');</script>");  // 输出登录成功提示脚本
*/

            ArrayList<Emp> emps = ies.queryAll();  // 调用服务层方法，查询所有员工信息
            session.setAttribute("emps",emps);//存属性值进作用域
            session.setAttribute("mess","登录成功");
            response.sendRedirect("show.jsp");
        } else {  // 如果登录失败
            //response.getWriter().println("<script type='text/javascript'>alert('登录失败 not ok!');</script>");  // 输出登录失败提示脚本
            response.sendRedirect("main.jsp");
            session.setAttribute("mess","登录失败");
        }
    }

    // 处理员工删除请求的方法
    public void empdel(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 设置响应内容类型和字符编码为UTF-8
        System.out.println("进入删除方法");  // 在控制台输出提示信息（用于调试）

        String empno = request.getParameter("empno");  // 从请求参数中获取要删除的员工编号
        boolean b = ies.removeByEmpno(Integer.parseInt(empno));  // 调用服务层删除方法，根据员工编号删除员工
        HttpSession session=request.getSession();
        if (b) {  // 如果删除成功
            //response.getWriter().println("<script type='text/javascript'>alert('删除成功!');</script>");  // 输出删除成功提示脚本
            session.setAttribute("mess","删除成功");
        } else {  // 如果删除失败
            //response.getWriter().println("<script type='text/javascript'>alert('删除失败!');</script>");  // 输出删除失败提示脚本

            session.setAttribute("mess","删除失败");
        }
        ArrayList<Emp> emps=ies.queryAll();
        session.setAttribute("emps",emps);
        response.sendRedirect("show.jsp");
}
}